package demo.letcode._初级算法;

/**
 * 给定一个非空整数数组，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素。
 * 说明：
 * 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗？
 *
 * 示例 1:
 * 输入: [2,2,1]
 * 输出: 1
 *
 * 示例 2:
 * 输入: [4,1,2,1,2]
 * 输出: 4
 *
 * @author taqo
 * @date 2021/5/6
 */
public class _只出现一次的数字 {
    public static void main(String[] args) {
        /**
         * & 同:全1为1,其它为0
         * | 或:有1为1,其它为0
         * ^ 异或:相同为0,其它为1
         * 因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算，单独的值就剩下
         * 按位异或的几个常见用途：
         * （1） 使某些特定的位翻转
         *
         * （2） 实现两个值的交换，而不必使用临时变量。
         *  a=a^b
         *  b=a^b
         *  a=a^b
         */
        int a[] = {2, 2, 4, 5, 4, 3, 3};
        System.out.println(singleNumber(a));
    }

    private static int singleNumber(int[] a) {
        int ret = 0;
        for (int i : a) {
            ret = ret ^ i;
        }
        return ret;
    }
}
